Swift ConcurrencyとNEHotspotConfigurationでシンプルなWi-Fi接続を実装する

Swift ConcurrencyとNEHotspotConfigurationでシンプルなWi-Fi接続を実装する

Clock Icon2024.06.24

現在開発中のアプリで、QRコードを読み込み、Wi-Fi接続をする必要があった。Wi-Fi接続をアプリに組み込むために、iOS 11から導入されたNEHotspotConfigurationNEHotspotConfigurationManagerを使った。

NEHotspotConfigurationNEHotspotConfigurationManagerの使い方については、以下の記事でSINさんが解説しているので詳細については割愛する。

NEHotspotConfigurationNEHotspotConfigurationManagerを使うことで、アプリはユーザーの手を借りずに特定のSSIDに接続できる。本記事ではSwift Concurrencyを使ってより簡単にWi-Fiホットスポットに接続する方法を紹介する。

1. NEHotspotConfigurationの設定

指定されたSSIDおよびパスフレーズを使ってWi-Fiネットワークに接続する。

この関数では、NEHotspotConfigurationを作成し、それをNEHotspotConfigurationManagerを通じて適用する。パスワードが提供されている場合は、WPA/WPA2用の設定を作成し、そうでない場合はオープンネットワークの設定を作成する。

Swift ConcurrencyのwithCheckedThrowingContinuationを使って非同期のエラー処理を行う。これにより、NEHotspotConfigurationManagerapplyメソッドの完了ハンドラーを非同期に処理できる。

private func connectToWiFi(ssidName: String, passphrase: String?) async throws {
    let configuration: NEHotspotConfiguration
    if let passphrase = passphrase {
        configuration = NEHotspotConfiguration(ssid: ssidName, passphrase: passphrase, isWEP: false)
    } else {
        configuration = NEHotspotConfiguration(ssid: ssidName)
    }

    try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
        NEHotspotConfigurationManager.shared.apply(configuration) { error in
            if let error = error {
                continuation.resume(throwing: error)
            } else {
                continuation.resume(returning: ())
            }
        }
    }
}

NEHotspotConfigurationErrorのエラーリスト

Wi-Fiの接続時になんらかの問題が発生するとエラーが投げられる。この関数から投げられるエラー NEHotspotConfigurationError は下表の通り。

エラー 説明
invalid 無効な設定
invalidSSID 無効なSSID
invalidWPAPassphrase 無効なWPAパスフレーズ
invalidWEPPassphrase 無効なWEPパスフレーズ
invalidEAPSettings 無効なEAP設定
invalidHS20Settings 無効なHS20設定
invalidHS20DomainName 無効なHS20ドメイン名
userDenied ユーザーが許可しなかった
internal 内部エラーが発生した

接続ダイアログでキャンセルをクリックすると userDenied エラーが投げられる。他のエラーと異なりユーザーが自身で選択して発生させたエラーのため、エラーダイアログを表示させないなどの工夫をすることでユーザーにとって使いやすいアプリになるだろう。

詳細な説明はこちらを参照。

2. Wi-Fiへの接続

上記のconnectToWiFi関数を利用して、特定のSSIDに接続するには、以下のようにパラメータを指定して実行する。

try await connectToWiFi(ssidName: "ssid name", passphrase: "passphrase")

3. ホットスポット構成の削除

特定のSSIDの構成を削除するには、以下のようにremoveConfigurationを実行する。

NEHotspotConfigurationManager.shared.removeConfiguration(forSSID: "ssid name")

Wi-Fi接続情報のQRコードフォーマット

Wi-Fiネットワークの設定をQRコードで提供する場合のフォーマットはある程度規格化されているようだ。以下のような形式のQRコードをスキャンすると、デバイスをWi-Fiネットワークに接続できる。詳細はこちらを参照。

例: WIFI:T:WPA;S:mynetwork;P:mypass;H:false;;

フォーマット例:

  • WPA/WPA2 Personal: WIFI:T:WPA;S:MyNetwork;P:mypassword;H:false;;
  • WEP: WIFI:T:WEP;S:MyNetwork;P:mypassword;H:false;;
  • オープンネットワーク: WIFI:T:nopass;S:MyOpenNetwork;H:false;;

各パラメータの説明

ユーザーが簡単にネットワークに接続できるQRコードを作成できる。

パラメータ 説明
T 認証タイプ(例: WPA, WEP, WPA2-EAP, nopass)
S SSID(ネットワーク名)
P パスワード(認証タイプがnopassの場合は省略可能)
H 隠しSSIDかどうか(trueまたはfalse)
E EAPメソッド(WPA2-EAPの場合のみ)
A 匿名ID(WPA2-EAPの場合のみ)
I ID(WPA2-EAPの場合のみ)
PH2 フェーズ2メソッド(WPA2-EAPの場合のみ)

まとめ

NEHotspotConfigurationとNEHotspotConfigurationManagerを使うことで、アプリ内から簡単にWi-Fiネットワークへの接続と切断を管理できる。Swift Concurrencyを利用することで、非同期操作がさらに簡単にできるようになった。

関連記事

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.